package practicapoo.source;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Objects;
import java.util.Comparator;

public class RegistroInformacion implements Serializable, Comparable {

    private double tarifaImporte;
    private boolean multadoBoolean;
    private Vehiculo vehiculo;
    private Camara camaraEntrada;
    private Camara camaraSalida;
    private Camara camaraMedia;
    private ArrayList<Multa> arrayMulta;
    private boolean trayectoFinalizado;
    private boolean pagado;

    public RegistroInformacion(Vehiculo transporte, Camara camaraEntrada) {
        this.vehiculo = transporte;
        this.multadoBoolean = false;
        this.camaraEntrada = camaraEntrada;
        this.tarifaImporte = 0;
        this.trayectoFinalizado = false;
        this.pagado = false;
        this.arrayMulta = new ArrayList();

        long tiempo = camaraEntrada.getFechahora().getTimeInMillis();
        tiempo = tiempo % 86400000;
        double fecha = (((tiempo / 1000) / 60) / 60);
        if ((fecha >= 0) && (fecha < 12)) {
            if (vehiculo.getTamaño() < 10) {
                this.tarifaImporte = 2.5;
            } else if (vehiculo.getTamaño() < 20) {
                this.tarifaImporte = 4;
            } else if (vehiculo.getTamaño() > 20) {
                this.tarifaImporte = 6.5;
            }
        } else if ((fecha >= 12) && (fecha < 24)) {
            if (vehiculo.getTamaño() < 10) {
                this.tarifaImporte = 3;
            } else if (vehiculo.getTamaño() < 20) {
                this.tarifaImporte = 5;
            } else if (vehiculo.getTamaño() > 20) {
                this.tarifaImporte = 8;
            }
        }
    }

    public void finTrayecto(Camara camaraSalida, Vehiculo vehiculo) {
        //calculamos primeramente la velocidad a partir del tiempo en carretera
        // teniendo en cuenta el tamaño de 100 KM de la vía
        long longEntrada = this.camaraEntrada.getFechahora().getTimeInMillis();
        long longSalida = camaraSalida.getFechahora().getTimeInMillis();
        double diferencia = longSalida - longEntrada;

        diferencia = diferencia / 1000; // traduccion a segundos
        diferencia = diferencia / 60; //traduccion a minutos
        diferencia = diferencia / 60; // traduccion a horas
        int tamaño = 100; // tamaño de la carretera
        double vel = tamaño / diferencia;
        if (vel > 120) {
            Multa multa1 = new Multa(this.camaraEntrada.getFechahora(), camaraSalida.getFechahora(), vel, vehiculo);
            this.arrayMulta.add(multa1);
            this.multadoBoolean = true;
        }
        this.camaraSalida = camaraSalida;


        this.trayectoFinalizado = true;
    }

    public void pagar() {
        this.pagado = true;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final RegistroInformacion other = (RegistroInformacion) obj;
        if (!Objects.equals(this.vehiculo, other.vehiculo)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return ("Matricula: " + this.vehiculo.getMatricula() + " \n"
                + "Tamaño: " + this.vehiculo.getTamaño() + " \n"
                + "Fecha y hora: " + this.camaraEntrada.getFechahora().getTime() + " \n"
                + "Tarifa a pagar: " + this.tarifaImporte);

    }

    public String cadenaHistorico() {
        return ("Entrada: " + this.camaraEntrada.getFechahora().getTime()
                + "     Salida: " + this.camaraSalida.getFechahora().getTime());
    }

    @Override
    public int hashCode() {
        int hash = 7;
        return hash;
    }

    public double getTarifaImporte() {
        return tarifaImporte;
    }

    public boolean isMultadoBoolean() {
        return multadoBoolean;
    }

    public Vehiculo getVehiculo() {
        return vehiculo;
    }

    public Camara getCamaraEntrada() {
        return camaraEntrada;
    }

    public Camara getCamaraSalida() {
        return camaraSalida;
    }

    public Camara getCamaraMedia() {
        return camaraMedia;
    }

    public ArrayList<Multa> getArrayMulta() {
        return arrayMulta;
    }

    public void setTarifaImporte(double tarifaImporte) {
        this.tarifaImporte = tarifaImporte;
    }

    public void setMultadoBoolean(boolean multadoBoolean) {
        this.multadoBoolean = multadoBoolean;
    }

    public void setVehiculo(Vehiculo vehiculo) {
        this.vehiculo = vehiculo;
    }

    public void setCamaraEntrada(Camara camaraEntrada) {
        this.camaraEntrada = camaraEntrada;
    }

    public void setCamaraSalida(Camara camaraSalida) {
        this.camaraSalida = camaraSalida;
    }

    public void setCamaraMedia(Camara camaraMedia) {
        this.camaraMedia = camaraMedia;
    }

    public void setArrayMulta(ArrayList<Multa> arrayMulta) {
        this.arrayMulta = arrayMulta;
    }

    public void setArrayMulta(Multa multa) {
        this.arrayMulta.add(multa);
    }

    public boolean isTrayectoFinalizado() {
        return trayectoFinalizado;
    }

    public void setTrayectoFinalizado(boolean trayectoFinalizado) {
        this.trayectoFinalizado = trayectoFinalizado;
    }

    @Override
    public int compareTo(Object o) {
        RegistroInformacion otra = (RegistroInformacion) o;
        if (this.camaraEntrada.getFechahora().getTimeInMillis() < otra.camaraEntrada.getFechahora().getTimeInMillis()) {
            return 1;
        } else if (this.camaraEntrada.getFechahora().getTimeInMillis() > otra.camaraEntrada.getFechahora().getTimeInMillis()) {
            return -1;
        }
        return 0;
    }
}
